]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
window-tracker: Consider Flatpak ID for window matching
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 7 Oct 2016 15:54:09 +0000 (17:54 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Mon, 10 Oct 2016 21:40:39 +0000 (23:40 +0200)
Our window matching currently fails frequently with Flatpak
applications, as one of the primary hints used to link windows
with .desktop files - the WM_CLASS - no longer matches when
flatpak renames the exported .desktop file. Worse, as Flatpak
applications are run in their own PID namespace, different
apps frequently share a common _NET_WM_PID, resulting in
unrelated apps being grouped together by one of the fallback
paths. To match Flatpak applications reliably, take the newly
exported Flatpak ID into account.

https://bugzilla.gnome.org/show_bug.cgi?id=772615

src/shell-window-tracker.c

index ad1219c13d25807b496cb5dcedb827296254b3b6..f87e6a3ae14122ee1942f370b6cd31d4301034e3 100644 (file)
@@ -203,29 +203,26 @@ get_app_from_window_wmclass (MetaWindow  *window)
 }
 
 /*
- * get_app_from_gapplication_id:
- * @monitor: a #ShellWindowTracker
+ * get_app_from_id:
  * @window: a #MetaWindow
  *
  * Looks only at the given window, and attempts to determine
- * an application based on _GTK_APPLICATION_ID.  If one can't be determined,
+ * an application based on %id.  If one can't be determined,
  * return %NULL.
  *
  * Return value: (transfer full): A newly-referenced #ShellApp, or %NULL
  */
 static ShellApp *
-get_app_from_gapplication_id (MetaWindow  *window)
+get_app_from_id (MetaWindow  *window,
+                 const char  *id)
 {
   ShellApp *app;
   ShellAppSystem *appsys;
-  const char *id;
   char *desktop_file;
 
-  appsys = shell_app_system_get_default ();
+  g_return_val_if_fail (id != NULL, NULL);
 
-  id = meta_window_get_gtk_application_id (window);
-  if (!id)
-    return NULL;
+  appsys = shell_app_system_get_default ();
 
   desktop_file = g_strconcat (id, ".desktop", NULL);
   app = shell_app_system_lookup_app (appsys, desktop_file);
@@ -236,6 +233,50 @@ get_app_from_gapplication_id (MetaWindow  *window)
   return app;
 }
 
+/*
+ * get_app_from_gapplication_id:
+ * @window: a #MetaWindow
+ *
+ * Looks only at the given window, and attempts to determine
+ * an application based on _GTK_APPLICATION_ID.  If one can't be determined,
+ * return %NULL.
+ *
+ * Return value: (transfer full): A newly-referenced #ShellApp, or %NULL
+ */
+static ShellApp *
+get_app_from_gapplication_id (MetaWindow  *window)
+{
+  const char *id;
+
+  id = meta_window_get_gtk_application_id (window);
+  if (!id)
+    return NULL;
+
+  return get_app_from_id (window, id);
+}
+
+/*
+ * get_app_from_flatpak_id:
+ * @window: a #MetaWindow
+ *
+ * Looks only at the given window, and attempts to determine
+ * an application based on its Flatpak ID.  If one can't be determined,
+ * return %NULL.
+ *
+ * Return value: (transfer full): A newly-referenced #ShellApp, or %NULL
+ */
+static ShellApp *
+get_app_from_flatpak_id (MetaWindow  *window)
+{
+  const char *id;
+
+  id = meta_window_get_flatpak_id (window);
+  if (!id)
+    return NULL;
+
+  return get_app_from_id (window, id);
+}
+
 /*
  * get_app_from_window_group:
  * @monitor: a #ShellWindowTracker
@@ -354,6 +395,13 @@ get_app_for_window (ShellWindowTracker    *tracker,
   if (meta_window_is_remote (window))
     return _shell_app_new_for_window (window);
 
+  /* Check if the window was opened from within a Flatpak sandbox; if this
+   * is the case, a corresponding .desktop file is guaranteed to match;
+   */
+  result = get_app_from_flatpak_id (window);
+  if (result != NULL)
+    return result;
+
   /* Check if the window has a GApplication ID attached; this is
    * canonical if it does
    */